package cn.iocoder.yudao.module.hs.service.tray;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.hs.controller.admin.tray.vo.TrayPageReqVO;
import cn.iocoder.yudao.module.hs.controller.admin.tray.vo.TraySaveReqVO;
import cn.iocoder.yudao.module.hs.dal.dataobject.tray.TrayDO;

import javax.validation.Valid;
import java.util.Set;

/**
 * 托盘信息 Service 接口
 *
 * @author 航盛
 */
public interface TrayService {

    /**
     * 创建托盘信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createTray(@Valid TraySaveReqVO createReqVO);

    /**
     * 更新托盘信息
     *
     * @param updateReqVO 更新信息
     */
    void updateTray(@Valid TraySaveReqVO updateReqVO);

    /**
     * 删除托盘信息
     *
     * @param id 编号
     */
    void deleteTray(Long id);

    /**
     * 获得托盘信息
     *
     * @param id 编号
     * @return 托盘信息
     */
    TrayDO getTray(Long id);

    /**
     * 获得托盘信息分页
     *
     * @param pageReqVO 分页查询
     * @return 托盘信息分页
     */
    PageResult<TrayDO> getTrayPage(TrayPageReqVO pageReqVO);

    /**
     * 通过trayCode获得托盘信息
     *
     * @param trayCode 托盘编码
     * @return 托盘信息
     */
    TrayDO getTray(String trayCode);

    /**
     * 根据托盘编码更新入库信息
     *
     * @param code 托盘编码
     */
    void updateTrayEntryByCode(String code, String rfidCode, Long warehouseId, Long deptId);

    /**
     * 根据rfid编码查询托盘信息
     *
     * @param rfidCode rfidCode
     * @return 托盘信息
     */
    TrayDO getTrayByRfidCode(String rfidCode);

    /**
     * 三方仓更新托盘信息，已出库
     *
     * @param trayCodes
     * @return
     */
    void updateTrayOut(Set<String> trayCodes, Long toWarehouseDeptId);

    /**
     * 三方仓更新托盘信息，回退
     *
     * @param trayCodes
     * @return
     */
    void updateTrayRollback(Set<String> trayCodes, Long warehouseId);

    /**
     * 解绑托盘和RFID
     * @param trayCodes
     */
    void updateTrayUnbind(Set<String> trayCodes);
}